多重起動2(CreateMutex) 今回説明する 多重起動のチェック方法 は CreateMutex API を使った
多重起動のチェックについてだ。
最近のネットゲームにおける 多重起動のチェック方法 として一番普及しているように思われる。
実際に多重起動チェック外しをするだけならばあまり意識する必要はないのだが、ミューテックスというものについて少し説明しておこう。
UNIX や linux でもそうであるが、一般的に ミューテックスとは排他処理を実現する ために使用されている。
排他とは?
例えばデータAにアクセスする別々のプロセス、BとCがあったとしよう。
まずプロセスBが最初にデータAにアクセスし内容を書き換えているとする。この状態で更にプロセスCがデータAにアクセスしたらどうなるか?
プロセスCがデータAの内容を読み取っているだけ(Read)ならいいのだが、もし同時に書き込みを行った場合はどうであろうか。
場合によってはOSが落ちてしまうかもしれないし、データA自体の整合がうまくとれずにデータが破壊され2度と復旧できなくなるかもしれない。
つまるところ、どのようなことが起きるのかは予測もできないし保障もできない。動作をすることになる。
これはイカン!というわけで生まれたのがミューテックス(排他)という概念だ。
Windows における排他ではまず、データAにアクセスするためには クリティカルセクション という通り道を通らなければならないように定めている。
クリティカルセクションを通るためには切符が要るのだが、その切符の名前はミューテックスオブジェクトと呼ばれている。
そしてミューテックスオブジェクトは一枚しか存在していない宝のような切符でもある。
ここで大事な事をひとつ。
クリティカルセクションを通れるのは一人だけである。
次の人が通れるようになるには最初の人が抜けた後、ミューテックスオブジェクトを返却してからとなる。これが排他処理の一連の動きだ。
まぁ、簡単に箇条書きにでもしてやるか。
1.プロセスBがミューテックスオブジェクトの取得申請をし、ゲットする。
2.プロセスBがクリティカルセクションを通り、データAにアクセスし処理を行う。
3.時を同じくしてプロセスCがやってくるが、ミューテックスオブジェクトの取得を申請するも既にプロセスBが取得しているのでNG.
4.プロセスBが処理を終え、ミューテックスオブジェクトを返却する。
5.やっとプロセスCがミューテックスオブジェクトを取得し、クリティカルセクションへ進んでいく。
説明が長くなったが、
もうおまえは CreateMutex についてほとんどのことを学んだことになる。
既に気づいたと思うが CreateMutex とはミューテックスオブジェクトを作成するために使用する API である。
この CreateMutex で ミューテックスオブジェクトが既に作成されているか? の判定を行うことにより、
多重起動のチェックをしている。
種がわかれば別段大した事では無いものだな。
それにしてもだ、
のどが渇いたからジュース買ってくる。
続きは自販機そばの教室でやるからさっさと来るんだぞ。
|